\tikzstyle{block} = [draw,rectangle,thick,minimum height=0.5cm,minimum width=0.5cm, node distance=3cm,thin]

\begin{tikzpicture}
	\node[block, name=regx] {寄存器X};
	\node[block, name=muxextregx, above of=regx] {外部-寄存器X选择器};
	\node[block, name=adderx, left of=regx] {加法器X};
	\node[block, name=shifterx, right of=regx] {位移器X};
	\node[block, name=romfi_x, above of=shifterx] {只读存储器Fi};
	\node[block, name=regy, below of=regx] {寄存器Y};
	\node[block, name=shiftery, left of=regy] {位移器Y};
	\node[block, name=romfi_y, left of=shiftery] {只读存储器Fi};
	\node[block, name=addery, right of=regy] {加法器Y};
	\node[block, name=muxextregy, below of=regy] {外部-寄存器Y选择器};
	\node[block, name=regz, below of=muxextregy] {寄存器Z};
	\node[block, name=adderz, below of=regz] {加法器Z};
	\node[block, name=romatan, left of=adderz] {反正切值存储器};
	\node[block, name=muxextregz, right of=regz] {外部-寄存器Z选择器};
	\node[block, name=muxregext, left of=muxextregy, node distance=5cm, minimum height=2cm] {寄存器-外部选择器};

	\draw [->, very thick, >=latex] (romfi_x) -- node[right=1pt] {ROMFiToShifter[2:0]} (shifterx);
	\draw [->, very thick, >=latex] (shifterx) -- node[right=1pt]{ShifterXToAdderY[7:0]}(addery);
	\draw [->, very thick, >=latex] (addery) |- node[right=1pt] {AdderYToMuxExtRegY[7:0]} (muxextregy);
	\draw [->, very thick, >=latex] (muxextregy) -- node[right=1pt] {MuxExtRegYToRegY[7:0]} (regy);
	\draw [->, very thick, >=latex] (regx) -- node[below=20pt, left=-30pt]{RegXToShifterXAdderX[7:0]} (shifterx);
	\draw [->, very thick, >=latex] (regx) -- (adderx);
	\draw [->, very thick, >=latex] (muxextregx) -- node [right=20pt, above=5pt] {MuxExtRegXToRegX[7:0]} (regx);
	\draw [->, very thick, >=latex] (adderx) |- node [left=1pt] {AdderXToMuxExtRegX[7:0]} (muxextregx);
	\draw [->, very thick, >=latex] (shiftery) --node [left=1pt] {ShifterYToAdderX[7:0]} (adderx);
	\draw [->, very thick, >=latex] (regy) -- node[above=20pt, right=-5pt] {RegYToShifterYAdderY[7:0]} (shiftery);
	\draw [->, very thick, >=latex] (regy) -- (addery);
	\draw [->, very thick, >=latex] (romfi_y) -- node[above=15pt, left=1pt] {ROMFiToShifter[2:0]} (shiftery);
	\draw [->, very thick, >=latex] (muxextregz) -- node[above=10pt]{MuxExtRegZToRegZ[7:0]} (regz);
	\draw [->, very thick, >=latex] (adderz) -| node [right=1pt] {AdderZToMuxExtRegZ[7:0]}(muxextregz);
	\draw [->, very thick, >=latex] (romatan) -- node[below=10pt]{ROMATANToAdderZ[7:0]}(adderz);
	\draw [->, very thick, >=latex] (regz) -- node [left=10pt] {RegZToAdderZ[7:0]} (adderz);
	\draw [->, very thick, >=latex] (regx) |- ++(0, -1.5cm) -| ++(-1.5cm, 0) |- ++(0, -2.5cm) -| ++(-1.5cm, 0) |- ([yshift=0.5cm]muxregext.east);
	\draw [->, very thick, >=latex] ([xshift=-0.5cm]regy.south) |- ++(0,-1.5cm) -| ++(-1.5cm, 0) |- (muxregext.east);
	\draw [->, very thick, >=latex] (regz) -| ++(-2,0) |- ([yshift=-0.5cm]muxregext.east);
	\draw [->, very thick, >=latex] (muxregext.south) -- node[below=30pt] {EXTDataOut[7:0]} (-5,-8.5);
	\draw [->, very thick, >=latex] (0,4) -- node[above=5pt] {EXTDataIn[7:0]} (muxextregx.north);
	\draw [->, very thick, >=latex] (0,-7) -- node[below=5pt] {EXTDataIn[7:0]} (muxextregy.south);
	\draw [->, very thick, >=latex] (5,-9) -- node[right=10pt] {EXTDataIn[7:0]} (muxextregz.east);
\end{tikzpicture}
